<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
          "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
  <title>Polly - Getting Started</title>
  <link type="text/css" rel="stylesheet" href="menu.css" />
  <link type="text/css" rel="stylesheet" href="content.css" />
</head>
<body>

<!--#include virtual="menu.html.incl"-->

<div id="content">

<h1>Getting Started: Building and Installing Polly</h1>

<h2> Automatic </h2>

There is a <a href="polly.sh">script</a> available to automatically checkout,
update, build, and test Polly. This script contains all the commands that are
subsequently described on this webpage. The automatic installation consists
of four simple steps:

<pre>
mkdir polly &amp;&amp; cd polly
wget http://polly.llvm.org/polly.sh
chmod +x polly.sh
./polly.sh
</pre>

<h2> Manual </h2>
<h3 id="source"> Get the code </h3>

The Polly source code is available in the LLVM SVN repository as well as through
an official git mirror. It is added to the <em>tools</em>
directory of the llvm sources.
<b>Polly and LLVM need to be checked out at the same time. Checkouts
   from different dates may not work!</b>
<h4>Set the directory layout:</h4>
<pre>
export BASE=`pwd`
export LLVM_SRC=${BASE}/llvm
export POLLY_SRC=${LLVM_SRC}/tools/polly

# Also build the matching clang-version (optional)
export CLANG_SRC=${LLVM_SRC}/tools/clang
</pre>

<h4>SVN</h4>
<pre>
svn checkout http://llvm.org/svn/llvm-project/llvm/trunk ${LLVM_SRC}
svn checkout http://llvm.org/svn/llvm-project/polly/trunk ${POLLY_SRC}

# Also build the matching clang-version (optional)
svn checkout http://llvm.org/svn/llvm-project/cfe/trunk ${CLANG_SRC}
</pre>
<h4>GIT</h4>
<pre>
git clone http://llvm.org/git/llvm.git ${LLVM_SRC}
git clone http://llvm.org/git/polly.git ${POLLY_SRC}

# Also build the matching clang-version (optional)
git clone http://llvm.org/git/clang.git ${CLANG_SRC}
</pre>
<h3 id="prerequisites"> Prerequisites </h3>
<ul>
<li>libgmp</li>
<li>CLooG/isl</li>
</ul>

<h4> libgmp </h4>
Install libgmp (library + developer package) through the package management
system of your operating system.

<h4> CLooG/isl</h4>

Polly is tested with a fixed version of <a href="http://www.cloog.org">CLooG</a>
and isl. To obtain the source code of CLooG (including isl) use
checkout_cloog.sh as available in ${POLLY_SRC}/utils/checkout_cloog.sh.

<h4>Set the directory layout:</h4>
<pre>
export CLOOG_SRC=${BASE}/cloog_src
export CLOOG_INSTALL=${BASE}/cloog_install
</pre>

<h4> First installation</h4>
<pre>
${POLLY_SRC}/utils/checkout_cloog.sh ${CLOOG_SRC}
cd ${CLOOG_SRC}
./configure --prefix=${CLOOG_INSTALL}
make
make install
cd ${BASE}
</pre>

<h4> Update the installation</h4>

Updating CLooG may become necessary, if Polly uses a feature
only available in a recent version of CLooG.
<pre>
${POLLY_SRC}/utils/checkout_cloog.sh ${CLOOG_SRC}
cd ${CLOOG_SRC}
make
make install
cd ${BASE}
</pre>

<h3 id="build">Build Polly</h3>

To build Polly you can either use the autoconf or the cmake build system. At the
moment only the autoconf build system allows to run the llvm test-suite and only
the cmake build system allows to run 'make polly-test'.

<h4>Set the directory layout:</h4>
<pre>
export LLVM_BUILD=${BASE}/llvm_build
mkdir ${LLVM_BUILD}
cd ${LLVM_BUILD}
</pre>

<h4>CMake</h4>

<pre>
cmake -DCMAKE_PREFIX_PATH=${CLOOG_INSTALL} ${LLVM_SRC}
make
</pre>

<h4> Autoconf </h4>

<pre>
${LLVM_SRC}/configure --with-cloog=${CLOOG_INSTALL} --with-isl=${CLOOG_INSTALL}
make
</pre>

<h3> Test Polly</h3>

<p>To check if Polly works correctly you can run <em>make polly-test</em> for the
cmake build or <em>make polly-test -C tools/polly/test/</em> for the autoconf
build.

<p>If you get something like <em>"... libisl.so.9: cannot open shared object file .."</em>,
it is because you installed cloog to a non-standard path, and libisl/libcloog
could not be found. To solve this issue, you need to append the path of parent
directory of libisl/libcloog, i.e. ${CLOOG_INSTALL}/lib, to LD_LIBRARY_PATH by:

<pre>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CLOOG_INSTALL}/lib</pre>

<h2> Optional Features </h2>

<h3> Pocc </h3>

<p>Polly can use <a href="http://www.cse.ohio-state.edu/~pouchet/software/pocc">
PoCC</a> as an external optimizer. PoCC is a research project that provides
an integrated version of <a href="http://pluto.sf.net">Pluto</a>, an
advanced data-locality and tileability optimizer. Polly includes internally
already a similar optimizer, such that in general PoCC is not needed. It is
only recommended for people who want to compare against a different
optimizer.</a>
<br/>
To use it install PoCC 1.0-rc3.1 (the one with Polly support) and add it to your PATH. 

<pre>
wget <a
href="http://www.cse.ohio-state.edu/~pouchet/software/pocc/download/pocc-1.0-rc3.1-full.tar.gz">http://www.cse.ohio-state.edu/~pouchet/software/pocc/download/pocc-1.0-rc3.1-full.tar.gz</a>
tar xzf pocc-1.0-rc3.1-full.tar.gz
cd pocc-1.0-rc3.1
./install.sh
export PATH=$PATH:`pwd`/bin
</pre>

You also need to install scoplib-0.2.0 and provide its location to
Polly's cmake or configure call.

<pre>
wget <a
href="http://www.cse.ohio-state.edu/~pouchet/software/pocc/download/modules/scoplib-0.2.0.tar.gz"
>http://www.cse.ohio-state.edu/~pouchet/software/pocc/download/modules/scoplib-0.2.0.tar.gz</a>
tar xzf  scoplib-0.2.0.tar.gz
cd scoplib-0.2.0
./configure --enable-mp-version --prefix=/path/to/scoplib/installation
make && make install
</pre>
</div>

</body>
</html>
